// $未搞定
/*
const x = { a: 8 };
const b = { x };
b.y = b; // 循环引用
JSON.stringify(b); // 触发报错
解决办法：
1，b.y = JSON.parse(JSON.stringify(b)); // 隐式深拷贝，主要实现深拷贝，解除循环引用
2，如下代码
  */

/**
 *获取数据类型
 * @export
 * @param {*} o:需要检测的数据
 * @return string
 */
export function getType(o) {
  return Object.prototype.toString.call(o).slice(8, -1)
}

/**
 * 判断是否是指定数据类型
 * @param {All} [o] 需要检测的数据
 * @param {String} [type] 数据类型
 * @returns {Boolean}
 */
function iskeyType(o, type) {
  return getType(o).toLowerCase() === type.toLowerCase()
}

const isComplexDataType = (obj) =>
  (typeof obj === 'object' || typeof obj === 'function') && obj !== null

const deepClone = function (obj, hash = new WeakMap()) {
  console.log(obj.constructor)
  if (obj.constructor === Date) return new Date(obj)
  if (obj.constructor === RegExp) return new RegExp(obj)
  // 如果循环引用了就用weakMap来解决
  if (hash.has(obj)) {
    hash.get(obj)
    return hash.get(obj)
  }
  const allDesc = Object.getOwnPropertyDescriptors(obj)

  const cloneObj = Object.create(Object.getPrototypeOf(obj), allDesc)

  // 继承原型链
  hash.set(obj, cloneObj)
  for (const key of Reflect.ownKeys(obj)) {
    cloneObj[key] =
      isComplexDataType(obj[key]) && typeof obj[key] !== 'function'
        ? deepClone(obj[key], hash)
        : obj[key]
  }
  return cloneObj
}
